package main

import "fmt"

func isMatch(s string, p string) bool {
	if p == ".*" {
		return true
	}
	pr := Regexp{pattern: []rune(p), ri: 0}
	sr := Regexp{pattern: []rune(s), ri: 0}
	var lastVal rune
	//头部对其
	for {
		if pr.get() == sr.get() || pr.get() == '.' {
			break
		}
		if !pr.next() {
			return false
		}
	}
	fmt.Printf("%q,%q,%d,%d\n", pr.get(), sr.get(), pr.ri, sr.ri)
	for {
		//起始判断
		if pr.get() == sr.get() {
			//当两个符合时，p指针右移
			if !pr.next() {
				break
			}
		} else {
			//否则当为通配符时右移
			if pr.get() == '.' && !pr.next() {
				// 通配符，且没有下一个规则跳出循环
				break
			}
			fmt.Printf("%q,%q,%d,%d\n", pr.get(), sr.get(), pr.ri, sr.ri)
			//当为星号时
			if pr.get() == '*' {
				//如果s当前值与上一个不同
				if sr.get() != lastVal {
					//p指针右移，*号区域结束
					if !pr.next() {
						break
					}
					fmt.Printf("pr.get=%q, sr.get()=%q\n", pr.get(), sr.get())
				}
				// 满足上一个条件时
				if pr.get() != '*' {
					//判断下一个p值与当前的s值是否相等
					if pr.get() != sr.get() {
						break
					}
					if pr.get() == sr.get() || pr.get() == '.' {
						if !pr.next() {
							break
						}
					}
				}
			}
		}
		//存储sr当前值
		lastVal = sr.get()
		//sr始终右移
		if !sr.next() {
			break
		}
	}
	if sr.get() == ' ' && pr.get() != ' ' {
		return false
	}
	if sr.next() || pr.next() {
		return false
	}
	return true
}

type Regexp struct {
	pattern []rune
	ri      int
}

func (r *Regexp) next() bool {
	if r.ri+1 < len(r.pattern) {
		r.ri++
		return true
	}
	r.ri++
	return false
}

func (r *Regexp) get() rune {
	if r.ri < len(r.pattern) {
		return r.pattern[r.ri]
	}
	return ' '
}
